你正在 VB 加油站!

最近更新

加油站台

下载区域

文档资料收集

写流言

瞧瞧流言

友情连接

写信给俺啦

 

I 数据库

A DAO

010 不用 EOF 以加快记录循环 98-8-22

通常我们使用以下的代码进行记录循环:

Do while not records.eof
combo1.additem records![Full Name]
records.movenext
loop

结果是每个循环中数据库都要进行一次数据结束测试。在大量的记录的情况下, 浪费的时间相当大。 而使用以下的代码, 可以提高近 1/3 的速度:

records.movelast
intRecCount=records.RecordCount
records.movefirst

for intCounter=1 to intRecCount
combo1.additem records![Full Name]
records.movenext
next intCounter到页首

009 断开所有的数据连接 98-8-21

如果在代码中使用了数据控件如 DAO, RDO, 或  ADO, 在退出时应该关闭所有打开的 recordset,  database,和  workspace 。 虽然对象能自动注销, 但是数据连接不会马上断开, 可能会导致一些内存不能被系统重新分配。

下面的代码可以关闭所有打开的 DAO workspace, 并释放所占的内存。

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    '
    Dim ws As Workspace
    Dim db As Database
    Dim rs As Recordset
    '
    For Each ws In Workspaces
        For Each db In ws.Databases
            For Each rs In db.Recordsets
                rs.Close
                Set rs = Nothing
            Next
            db.Close
            Set db = Nothing
        Next
        ws.Close
        Set ws = Nothing
    Next
    '
End Sub到页首

008 取得下个自动生成的 ID 98-8-20

在许多数据库里我们使用了自动增加的 ID, 能取得下个自动产生的 ID, 意味着在数据增加后, 不再需要使用 LastModified 属性和 bookmarks。
With Data1.Recordset
    .AddNew
    MsgBox !ID  '下个自动生成的 ID
    .CancelUpdate
End With到页首

007 用DATA控件绑定报表控件打印报表 98-8-09

1 在数据库中生成一TEMP表。
2 用报表生成器生成报表,然后删除数据库中的TEMP表。
3 在VB中打开数据库,用OPENRECORDSET语句生成一个RECORDSET
     (此RECORDSET的结构要与第一步生成的TEMP表一样,但记录数可以
      用WHERE子句限制)
   用SET DATA1.RECORDSET=RS(RECORDSET)将RECORDSET的数据赋予数据控件。
4 设定报表控件的REPORTFILENAME属性为报表文件名;
     REPORTSOURCE属性为3;
     DATASOURCE属性为数据控件名
5 执行ME.CR1.ACTION=1即可打印。
但我不知如何直接利用RECORDSET中的数据,如果你知道请告知。
感谢由 FENG 提供该技巧。到页首

006 取得正确的 RecordCount 值 98-8-03

特别是在 RecordSet 中记录比较多的情况,在更新 RecordSet 后 RecordCount 返回的值一般比真实的值要小, 以下的方法可以保证得到正确的值:

  Data1.Recordset.MoveLast
    RCount =  Data1.Recordset.RecordCount 到页首

005 锁住数据库中的表 98-8-02

把表达式 True=False 放到表的 ValidationRule 属性就能锁上。 HardLockTable  实现了该功能。

声明
Public MyDB As Database
Dim Dummy As Integer

函数
Function HardLockTable (ByVal whichAction As String,  ByVal aTable As String) As Integer
On Error GoTo HardLockTableError
HardLockTable = True
Select Case whichAction
Case "Lock"
MyDB.TableDefs(aTable).ValidationRule = "True=False"
MyDB.TableDefs(aTable).ValidationText =  "This table locked via " &   "ValidationRule on " & Now
Case "UnLock"
MyDB.TableDefs(aTable).ValidationRule = ""
MyDB.TableDefs(aTable).ValidationText = ""
Case "TestThenUnLock"
If MyDB.TableDefs(aTable).ValidationRule = "True=False" Then
MyDB.TableDefs(aTable).ValidationRule = ""
MyDB.TableDefs(aTable).ValidationText = ""
End If
End Select
HardLockTableErrorExit:
'subFlushDBEngine
'optional, see next suggestion
Exit Function
HardLockTableError:
HardLockTable = False
MsgBox Error$ & " error " & "in HardLockTable trying " & "to " & whichAction & " " & aTable
Resume HardLockTableErrorExit
End Function

使用例子
'上锁
Dummy = HardLockTable("Lock", "TestTable")
' 开锁
Dummy = HardLockTable("UnLock", "TestTable")
到页首

004 Data 控件使用有密码的 Access 数据库 98-7-28

使用 Data 控件打开 Accecc 数据库:
  设置 Connect  属性为 ;pwd=_密码_
修改密码:
  Data1.Database.NewPassword  _老密码_, _新密码_到页首

003 处理在 Access 数据库中的 Null 值

Access 的字符串字段可以包含  NULL 值。在读这些字段到 VB 的 String 变量时,会出现运行时间的错误。最好的解决方法是使用 & 操作符将该字段与空串连接:

sString = "" & RS(0)
到页首

002 表或查询是否存在

在 VB5 中需要 Microsoft DAO 3.x Object Library。

Public Const NameNotInCollection = 3265
Dim DB As Database

Private Function ExistsTableQuery(TName As String) As Boolean

Dim Test As String
On Error Resume Next

' 该名字在表名中是否存在。
Test = db.TableDefs(TName).Name
If Err <> NameNotInCollection Then
ExistsTableQuery = True
' Reset the error variable:
Err = 0
' 该名字在查询中是否存在。
Test = db.QueryDefs(TName$).Name
If Err <> NameNotInCollection Then
ExistsTableQuery = True
End If
End If
End Function到页首

001 连接Data到多个表单

假设 Form1,Form2 表单都有 Data 控件,在 Form2 的 Form_Load 事件中加入以下的代码,可以实现对DATA 的多个连接。

Sub Form_Load ()
Set Data1.Recordset = Form1.Data1.Recordset
End Sub到页首

 

知/的/更/多 做/的/更/好